#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+5;
int n,q,c;
int head[N],to[N<<1],nxt[N<<1],tot,col[N],p[N];
auto *it=new unsigned;
mt19937 rnd(time(0)^(*it));
inline void add(int u,int v){
	nxt[++tot]=head[u],to[tot]=v,head[u]=tot;
}
bool vis[N];
int cnt;
vector<int>vec[N];
int you[N],pro,fnxt[N];
struct node{
	int u,id;
};
vector<node>qr[N];
bool bee[N];
int tt;
struct ds{
	int ton[N],fa[N];
	int siz[N];
	inline void init(){
		for(int i=1;i<=n;i++)fa[i]=i,ton[i]=1;
	}
	inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
	inline void merge(int x,int y){
//		tt++;
		x=find(x),y=find(y);
		if(x==y)return ;
		ton[y]+=ton[x];
		fa[x]=y;
	}
	inline int gsiz(int x){return ton[find(x)];}
	inline void clear(int co){
		for(int i=0;i<c;i++){
			if((co>>i)&1){
				for(auto j:vec[i]){
					fa[j]=j,ton[j]=1;
				}
			}
		}
	}
}T;
inline void add_color(int x,int up){
	for(auto u:vec[x]){
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i];
			if((up>>col[v])&1)T.merge(u,v);
		}
	}
}
int ans[N];
inline int glas(int x){
	int res=0;
	for(int i=1;i<=x;i++){
		if((x|i)==x&&!vis[i])res++;
	}
	return res;
}
inline void solve(int x){
//	if(vis[x])return ;
	vis[x]=1;
	if(__builtin_popcount(x)==1){
		int s=__lg(x);
		add_color(s,x);
		if(bee[x])return ;
		for(auto i:qr[x]){
			if(!((x>>col[i.u])&1))ans[i.id]=1;
			else{
				ans[i.id]=T.gsiz(i.u);
			}
		}
		bee[x]=1;
		return ;
	}
	int id=0;
	for(int i=0;i<c;i++){
		if(x&(1<<i)){
			int y=x^(1<<i);
			if(vis[y])continue;
			if(!id||glas(id)<glas(y))id=y;
		}
	}
	if(id)solve(id);
	else{
		for(int i=0;i<c;i++){
			if(x&(1<<i)){
				int y=x^(1<<i);
				if(!id||glas(id)<glas(y))id=y;
			}
		}
		solve(id);
	}
	int s=__lg(x^id);
	add_color(s,x);
	if(bee[x])return ;
	for(auto i:qr[x]){
		if(!((x>>col[i.u])&1))ans[i.id]=1;
		else{
			ans[i.id]=T.gsiz(i.u);
		}
	}
	bee[x]=1;
}
int main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>q>>c;
	for(int i=1;i<=n;i++)cin>>col[i],vec[col[i]].push_back(i);
	for(int i=2;i<=n;i++){
		cin>>p[i];
		add(p[i],i);add(i,p[i]);
	}
	int x,u;
	for(int i=1;i<=q;i++){
		cin>>x>>u;
		qr[x].push_back({u,i});
	}
	T.init();
	for(int i=(1<<c)-1;i>=1;i--){
		if(vis[i])continue;
		T.clear(i);
		cnt++;
		solve(i);
	}
	cerr<<cnt<<" "<<tt<<"\n";
	for(int i=1;i<=q;i++)cout<<max(ans[i],1)<<"\n";
	return 0;
}

